package fr.utt.millebornes.cartes;
import fr.utt.millebornes.exception.AvancementImpossibleAttaqueException;
import fr.utt.millebornes.exception.AvancementImpossibleEtape200Exception;
import fr.utt.millebornes.exception.AvancementImpossibleFeuVertException;
import fr.utt.millebornes.exception.AvancementImpossibleKilometresException;
import fr.utt.millebornes.exception.AvancementImpossibleRalentissementException;
import fr.utt.millebornes.exception.BotteException;
import fr.utt.millebornes.exception.CibleIncorrecteException;
import fr.utt.millebornes.exception.CibleSuicideException;
import fr.utt.millebornes.exception.CoupFourreException;
import fr.utt.millebornes.exception.DejaAttaqueException;
import fr.utt.millebornes.exception.DejaRalentiException;
import fr.utt.millebornes.exception.ImmuniseException;
import fr.utt.millebornes.exception.JoueurDebutantNonAttaquableException;
import fr.utt.millebornes.exception.MauvaiseParadeException;
import fr.utt.millebornes.exception.NonAttaqueException;
import fr.utt.millebornes.exception.NonRalentiException;
import fr.utt.millebornes.jeu.Partie;
import fr.utt.millebornes.joueur.Joueur;


public abstract class Botte extends CarteDefensive {

	private static final int VALEUR_COUP_FOURRE = 300;
	public Botte() {
		pileDestination = Joueur.PILE_BOTTES;
	}
	public boolean isCarteBotte() {
		return true;
	}

	// /!\ On peut tjs poser une botte
	public boolean peutEtrePosee(Joueur jcible) {
		return true;
	}
	
	public boolean jouer(Joueur jsource, Joueur jcible) throws CoupFourreException, DejaAttaqueException, ImmuniseException, JoueurDebutantNonAttaquableException, DejaRalentiException, CibleSuicideException, AvancementImpossibleRalentissementException, AvancementImpossibleEtape200Exception, NonAttaqueException, MauvaiseParadeException, NonRalentiException, AvancementImpossibleAttaqueException, AvancementImpossibleFeuVertException, AvancementImpossibleKilometresException, BotteException, CibleIncorrecteException {
		if (jsource!=jcible) 
			throw new CibleIncorrecteException();
		return super.jouer(jsource, jcible);
	}
	
	protected void effetDeJeu(Joueur jsource,Joueur jcible) throws BotteException {
		if (!jsource.estPasAttaque()) {
			if (this.peutContrer(jsource.getAttaqueEnCours())) 
				jsource.defausserPileBataille();
		}
		if (!jsource.estRalentissable())
		{
			if (this.peutContrer(jsource.getRalentissementEnCours())) 
				jsource.defausserPileVitesse();
		}
		if ((jsource.getNombreDeKilometres()+100) <= Partie.KILOMETRES_POUR_LA_VICTOIRE)
			jsource.ajouterKilometres(100);
		throw new BotteException();
	}

	public void jouerCoupFourre(Joueur jsource) {
		jsource.supprimerCarteDeLaMain(this);
		jsource.poser(this);
		if (!jsource.estPasAttaque()) {
			if (this.peutContrer(jsource.getAttaqueEnCours())) 
				jsource.defausserPileBataille();
		}
		if (!jsource.estRalentissable())
		{
			if (this.peutContrer(jsource.getRalentissementEnCours())) 
				jsource.defausserPileVitesse();
		}
		if ((jsource.getNombreDeKilometres()+VALEUR_COUP_FOURRE) <= Partie.KILOMETRES_POUR_LA_VICTOIRE)
			jsource.ajouterKilometres(VALEUR_COUP_FOURRE);
	}

}

